#include <iostream>
#include <cassert>
#include <cstring>
#include <unistd.h>
#include <signal.h>

using namespace std;

void SigpendingPrint(sigset_t* set)
{
    cout << "当前进程的pending位图: ";
    for(int sigo = 1; sigo <= 31; sigo++)
    {
        if(sigismember(set, sigo))
            cout << 1;
        else
            cout << 0; 
    }

    cout << endl;
}

void handler(int signo)
{
    cout << "已执行对" << signo << "信号的捕捉" << endl;
    // pending表在被调用之前就被清0
    // cout << "pending位是否被置空: " << !sigismember(&pending, signo) << endl;
    int cnt = 60;
    while(cnt--)
    {
        sigset_t pending;
        sigpending(&pending);
        SigpendingPrint(&pending);

        sleep(1);
    }
}

int main()
{
    struct sigaction act;
    memset(&act, 0, sizeof(act));
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);

    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    sigaddset(&act.sa_mask, 5);

    sigaction(2, &act, nullptr);

    while(true)
    {
        cout << getpid() << endl;
        sleep(1);
    }
    // 未决状态的捕捉
    // signal(2, handler);
    // sigset_t set, oset;
    // sigemptyset(&set);
    // sigemptyset(&oset);

    // sigaddset(&set, 2);
    // //sigaddset(&set, 3);
    // sigprocmask(SIG_BLOCK, &set, &oset);

    // int cnt = 0;
    // while(true)
    // {
    //     sigset_t pending;
    //     sigemptyset(&pending);

    //     int n = sigpending(&pending);
    //     assert(n != -1);
    //     (void)n;

    //     SigpendingPrint(&pending);
    //     sleep(1);
    //     if(cnt++ == 10)
    //     {
    //         cout << "解除对2号信号的屏蔽" << endl;
    //         sigprocmask(SIG_SETMASK, &oset, nullptr);
    //     }
    // }
    return 0;
}